package com.bincloud.vue.admin.web.util.redis.impl;

import com.bincloud.vue.admin.common.exception.BaseException;
import com.bincloud.vue.admin.common.exception.CodeMsg;
import com.bincloud.vue.admin.web.util.redis.RedisService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * redis 工具类 实现
 * @author bincloud, mvpzhou
 */
@Service
@Slf4j
public class RedisServiceImpl implements RedisService {
    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 设置键值
     * @param k 键
     * @param v 值
     * @param t 过期时间
     * @param u 单位
     */
    @Override
    public void set(String k, Object v, long t, TimeUnit u) {
        try {
            redisTemplate.opsForValue().set(k, v, t, u);
        } catch (Exception e) {
            throw new BaseException(CodeMsg.REDIS_SET_FAIL);
        }
    }

    /**
     * 设置键值
     * @param k 键
     * @param v 值
     * @param t 过期时间 单位秒
     */
    @Override
    public void set(String k, Object v, long t) {
        try {
            set(k, v, t, TimeUnit.SECONDS);
        } catch (Exception e) {
            throw new BaseException(CodeMsg.REDIS_SET_FAIL);
        }
    }

    /**
     * 设置键值
     * @param k 键
     * @param v 值
     */
    @Override
    public void set(String k, Object v) {
        try {
            redisTemplate.opsForValue().set(k, v);
        } catch (Exception e) {
            throw new BaseException(CodeMsg.REDIS_SET_FAIL);
        }
    }

    /**
     * 获取键值
     * @param k 键
     * @return 值
     */
    @Override
    public Object get(String k) {
        try {
            return redisTemplate.opsForValue().get(k);
        } catch (Exception e) {
            throw new BaseException(CodeMsg.REDIS_GET_FAIL);
        }
    }

    /**
     * 获取过期时间
     *
     * @param k 键
     * @param u 单位
     * @return 值
     */
    @Override
    public Long getExpire(String k, TimeUnit u) {
        try {
            return redisTemplate.getExpire(k, u);
        } catch (Exception e) {
            throw new BaseException(CodeMsg.REDIS_GET_FAIL);
        }
    }

    /**
     * 获取过期时间
     *
     * @param k 键
     * @return 值 单位秒
     */
    @Override
    public Long getExpire(String k) {
        try {
            return redisTemplate.getExpire(k);
        } catch (Exception e) {
            throw new BaseException(CodeMsg.REDIS_GET_FAIL);
        }
    }

    /**
     * 删除键值
     *
     * @param k 键
     */
    @Override
    public void del(String k) {
        try {
            redisTemplate.delete(k);
        } catch (Exception e) {
            throw new BaseException(CodeMsg.REDIS_DELETE_FAIL);
        }
    }

}
